

package com.hazelcast.spi.discovery.multicast.impl;

import com.hazelcast.logging.ILogger;

import java.net.DatagramPacket;
import java.net.MulticastSocket;

public class MulticastDiscoveryReceiver {

    private static final int DATAGRAM_BUFFER_SIZE = 64 * 1024;

    private final MulticastSocket multicastSocket;
    private final DatagramPacket datagramPacketReceive = new DatagramPacket(new byte[DATAGRAM_BUFFER_SIZE], DATAGRAM_BUFFER_SIZE);
    private final ILogger logger;
    private final MulticastDiscoverySerializationHelper serializationHelper;

    public MulticastDiscoveryReceiver(MulticastSocket multicastSocket, ILogger logger, MulticastDiscoverySerializationHelper serializationHelper) {
        this.multicastSocket = multicastSocket;
        this.logger = logger;
        this.serializationHelper = serializationHelper;
    }

    public MulticastMemberInfo receive() {
        try {
            multicastSocket.receive(datagramPacketReceive);
            byte[] data = datagramPacketReceive.getData();
            return serializationHelper.deserialize(data);
        } catch (Exception e) {
            if (logger.isFinestEnabled()) {
                logger.finest("Couldn't get member info from multicast channel %s", e.getMessage());
            }
        }
        return null;
    }
}
